package com.sheng.leetcode.year2023.month08.day22;

import org.junit.Test;

/**
 * @author by ls
 * @date 2023/8/22
 * <p>
 * 849. 到最近的人的最大距离<p>
 * <p>
 * 给你一个数组 seats 表示一排座位，其中 seats[i] = 1 代表有人坐在第 i 个座位上，<p>
 * seats[i] = 0 代表座位 i 上是空的（下标从 0 开始）。<p>
 * 至少有一个空座位，且至少有一人已经坐在座位上。<p>
 * 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。<p>
 * 返回他到离他最近的人的最大距离。<p>
 * <p>
 * 示例 1：<p>
 * 输入：seats = [1,0,0,0,1,0,1]<p>
 * 输出：2<p>
 * 解释：<p>
 * 如果亚历克斯坐在第二个空位（seats[2]）上，他到离他最近的人的距离为 2 。<p>
 * 如果亚历克斯坐在其它任何一个空位上，他到离他最近的人的距离为 1 。<p>
 * 因此，他到离他最近的人的最大距离是 2 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：seats = [1,0,0,0]<p>
 * 输出：3<p>
 * 解释：<p>
 * 如果亚历克斯坐在最后一个座位上，他离最近的人有 3 个座位远。<p>
 * 这是可能的最大距离，所以答案是 3 。<p>
 * <p>
 * 示例 3：<p>
 * 输入：seats = [0,1]<p>
 * 输出：1<p>
 * <p>
 * 提示：<p>
 * 2 <= seats.length <= 2 * 10^4<p>
 * seats[i] 为 0 或 1<p>
 * 至少有一个 空座位<p>
 * 至少有一个 座位上有人<p>
 */
public class LeetCode0849 {

    @Test
    public void test01() {
//        int[] seats = {1, 0, 0, 0, 1, 0, 1};
        int[] seats = {1, 0, 0, 0};
//        int[] seats = {0, 1};
//        int[] seats = {1, 0, 0, 1};
        System.out.println(new Solution().maxDistToClosest(seats));
    }
}

class Solution {
    public int maxDistToClosest(int[] seats) {
        // 选取值为 0 的位置，与值为 1 的元素所距离的最近值，求连续的 0 的长度的一半
        int max = 0;
        // 整型数组转化为字符串，然后拆分
//        String[] split = Arrays.stream(seats).mapToObj(String::valueOf).collect(Collectors.joining()).split("1");
//        for (int i = 0; i < split.length; i++) {
//            // 如果连续的 0 位于首尾
//            if (i == 0 || (i == split.length - 1 && seats[seats.length - 1] != 1)) {
//                max = Math.max(max, split[i].length());
//            } else {
//                // 左右都有 1 的情况下
//                max = Math.max(max, split[i].length() % 2 == 0 ? split[i].length() / 2 : split[i].length() / 2 + 1);
//            }
//        }
//        return max;
        // 滑块，左右短点代表 1
        int left = -1, right = -1;
        for (int i = 0; i < seats.length; i++) {
            if (seats[i] == 1) {
                if (left == -1) {
                    left = i;
                }
                if (right != -1) {
                    max = Math.max((i - right) / 2, max);
                }
                right = i;
            }
        }
        return Math.max(max, Math.max(left, seats.length - right - 1));
    }
}
